package cn.iocoder.yudao.module.energy.util;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

import java.io.IOException;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;

import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;

/**
 * 自定义的LocalDateTime反序列化器
 * 用于处理前端传入的不同格式的日期，包括:
 * 1. yyyy-MM-dd HH:mm:ss格式字符串
 * 2. 时间戳
 */
public class CustomLocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {

    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern(FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);

    @Override
    public LocalDateTime deserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException {
        // 记录当前处理的内容
        System.out.println("开始解析日期: " + parser.getText() + ", 当前token类型: " + parser.currentToken());
        
        // 根据不同类型的token进行处理
        if (parser.currentToken() == JsonToken.VALUE_STRING) {
            return parseStringDate(parser.getText());
        } else if (parser.currentToken() == JsonToken.VALUE_NUMBER_INT) {
            return parseTimestamp(parser.getLongValue());
        } else if (parser.currentToken() == JsonToken.START_OBJECT) {
            // 处理复杂对象，比如嵌套的日期对象
            return parseObject(parser);
        }
        
        // 无法识别的类型，返回当前时间
        System.out.println("无法识别的日期格式，使用当前时间");
        return LocalDateTime.now();
    }
    
    /**
     * 尝试解析字符串格式的日期
     */
    private LocalDateTime parseStringDate(String dateStr) {
        if (dateStr == null || dateStr.isEmpty() || dateStr.contains("1970-01-01")) {
            System.out.println("日期字符串无效或为1970年: " + dateStr);
            return LocalDateTime.now();
        }
        
        try {
            // 尝试使用标准格式解析
            return LocalDateTime.parse(dateStr, FORMATTER);
        } catch (DateTimeParseException e) {
            // 标准格式解析失败，尝试使用ISO格式
            try {
                return LocalDateTime.parse(dateStr);
            } catch (Exception e2) {
                System.out.println("日期解析失败: " + dateStr + ", 错误: " + e2.getMessage());
                return LocalDateTime.now();
            }
        }
    }
    
    /**
     * 解析时间戳格式的日期
     */
    private LocalDateTime parseTimestamp(long timestamp) {
        // 如果时间戳小于一个合理值，可能表示错误
        if (timestamp < 1000000000000L) {
            // 可能是秒级时间戳，转换为毫秒
            timestamp *= 1000;
        }
        
        // 将时间戳转换为LocalDateTime
        try {
            return LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.systemDefault());
        } catch (Exception e) {
            System.out.println("时间戳解析失败: " + timestamp + ", 错误: " + e.getMessage());
            return LocalDateTime.now();
        }
    }
    
    /**
     * 解析复杂对象格式的日期
     */
    private LocalDateTime parseObject(JsonParser parser) throws IOException {
        // 简单实现，读取到对象结束
        while (parser.nextToken() != JsonToken.END_OBJECT) {
            // 跳过对象内容
        }
        System.out.println("跳过对象格式日期，使用当前时间");
        return LocalDateTime.now();
    }
} 